
package com.syu.loopcure.common.utils;

import com.syu.loopcure.common.constants.LoopCoreGlobalConstant;
import org.springframework.util.StringUtils;

import java.security.MessageDigest;
import java.util.concurrent.atomic.AtomicReference;

/**  
 * ClassName: MD5Utils <br/>  
 * Function: md5加密工具类. <br/>   
 * date: 2020年8月12日 上午9:15:00 <br/>  
 *  
 * @author zhucun
 * @since JDK 1.8  
 */
public class Md5Utils {
	
	
	/**
	 * 
	 * byteArrayToHexString <br/>  
	 *  
	 * @param bytes 字节
	 * @return  {@link String}
	 * @since JDK 1.8  
	 * @author zhucun  
	 * @date 2020年8月12日 上午9:36:30
	 * @modifier zhucun
	 * @modifyDate 2020年8月12日 上午9:36:30
	 */
	private static String byteArrayToHexString(byte[] bytes) {
        AtomicReference<StringBuffer> resultSb = new AtomicReference<>(new StringBuffer());
        for (byte aByte : bytes) {
            resultSb.get().append(byteToHexString(aByte));
        }
        return resultSb.toString();
    }

	/**
	 * 
	 * byteToHexString <br/>  
	 *  
	 * @param bytes 字节
	 * @return  {@link String}
	 * @since JDK 1.8  
	 * @author zhucun  
	 * @date 2020年8月12日 上午9:37:04
	 * @modifier zhucun
	 * @modifyDate 2020年8月12日 上午9:37:04
	 */
    private static String byteToHexString(byte bytes) {
        int n = bytes;
        if (n < 0) {
            n += 256;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return LoopCoreGlobalConstant.HEX_DIGITS[d1] + LoopCoreGlobalConstant.HEX_DIGITS[d2];
    }

    /**
     * 
     * MD5Encode <br/>  
     *  
     * @param origin 原始字符串
     * @param charsetname eg. UTF-8
     * @return  {@link String}
     * @since JDK 1.8  
     * @author zhucun  
     * @date 2020年8月12日 上午9:37:26
     * @modifier zhucun
     * @modifyDate 2020年8月12日 上午9:37:26
     */
    public static String md5Encode(String origin, String charsetname) {
        String resultString;
        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance(LoopCoreGlobalConstant.MD5_STR);
            if (StringUtils.isEmpty(charsetname)) {
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            } else {
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
            }
        } catch (Exception e) {
        	throw new RuntimeException(e);
        }
        return resultString;
    }
}
  
